home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
boot
/
czesc_2
/
toolmanager
/
source
/
prefs
/
dockwindow.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-05-15
|
39KB
|
1,297 lines
/*
* dockwindow.c V2.1
*
* dock edit window handling
*
* (c) 1990-1993 Stefan Becker
*/
#include "ToolManagerConf.h"
struct DockNode {
struct Node dn_Node;
ULONG dn_Flags;
char *dn_HotKey;
char *dn_PubScreen;
char *dn_Title;
struct TextAttr dn_Font;
char *dn_FontDesc;
LONG dn_XPos;
LONG dn_YPos;
ULONG dn_Columns;
struct List *dn_ToolsList;
};
/* Window data */
static struct Gadget *gl; /* Gadget list */
static struct Window *w; /* Window */
static struct MsgPort *wp; /* Window user port */
static UWORD ww,wh; /* Window size */
static struct DockNode *CurrentNode;
static ULONG CurrentGadgetNum;
static BOOL ReqOpen;
static struct Requester DummyReq;
#define WINDOW_IDCMP (IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|BUTTONIDCMP|\
CHECKBOXIDCMP|STRINGIDCMP|IDCMP_VANILLAKEY)
/* Gadget data */
#define GAD_NAME_STR 0 /* Gadgets with labels (left side) */
#define GAD_TITLE_STR 1
#define GAD_HOTKEY_STR 2
#define GAD_XPOS_INT 3
#define GAD_YPOS_INT 4
#define GAD_COLUMNS_INT 5
#define GAD_POSITION 6 /* Cycle gadget */
#define GAD_PSCREEN_BUT 7 /* Gadgets with labels (right side) */
#define GAD_PSCREEN_TXT 8
#define GAD_FONT_BUT 9
#define GAD_PSCREEN_STR 10
#define GAD_FONT_TXT 11
#define GAD_TOOLS 12 /* Button gadget */
#define GAD_ACTIVATED 13 /* Checkbox gadgets */
#define GAD_BACKDROP 14
#define GAD_CENTERED 15
#define GAD_FRONTMOST 16
#define GAD_MENU 17
#define GAD_PATTERN 18
#define GAD_POPUP 19
#define GAD_STICKY 20
#define GAD_TEXT 21
#define GAD_VERTICAL 22
#define GAD_OK 23 /* Button gadgets */
#define GAD_CANCEL 24
#define GADGETS 25
static struct GadgetData gdata[GADGETS];
/* Gadget tags */
static struct TagItem nametags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
static struct TagItem hotktags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
static struct TagItem pbsctags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
static struct TagItem fonttags[]={GTTX_Text, NULL,
GTTX_Border, TRUE,
TAG_DONE};
static struct TagItem titletags[]={GTST_String, NULL,
GTST_MaxChars, SGBUFLEN,
TAG_DONE};
static struct TagItem xpostags[]={GTIN_Number, 0,
GTIN_MaxChars, 10,
TAG_DONE};
static struct TagItem ypostags[]={GTIN_Number, 0,
GTIN_MaxChars, 10,
TAG_DONE};
static char *cyclelabels[3]={NULL, NULL, NULL};
static struct TagItem cycletags[]={GTCY_Labels, (ULONG) cyclelabels,
GTCY_Active, 0,
TAG_DONE};
static struct TagItem colstags[]={GTIN_Number, 0,
GTIN_MaxChars, 10,
TAG_DONE};
static struct TagItem actitags[]={GTCB_Checked, FALSE,
GTCB_Scaled, TRUE,
TAG_DONE};
static struct TagItem backdtags[]={GTCB_Checked, FALSE,
GTCB_Scaled, TRUE,
TAG_DONE};
static struct TagItem centtags[]={GTCB_Checked, FALSE,
GTCB_Scaled, TRUE,
TAG_DONE};
static struct TagItem fronttags[]={GTCB_Checked, FALSE,
GTCB_Scaled, TRUE,
TAG_DONE};
static struct TagItem menutags[]={GTCB_Checked, FALSE,
GTCB_Scaled, TRUE,
TAG_DONE};
static struct TagItem patttags[]={GTCB_Checked, FALSE,
GTCB_Scaled, TRUE,
TAG_DONE};
static struct TagItem popuptags[]={GTCB_Checked, FALSE,
GTCB_Scaled, TRUE,
TAG_DONE};
static struct TagItem stickytags[]={GTCB_Checked, FALSE,
GTCB_Scaled, TRUE,
TAG_DONE};
static struct TagItem texttags[]={GTCB_Checked, FALSE,
GTCB_Scaled, TRUE,
TAG_DONE};
static struct TagItem verttags[]={GTCB_Checked, FALSE,
GTCB_Scaled, TRUE,
TAG_DONE};
/* Gadget vanilla key data */
#define KEY_NAME 0
#define KEY_TITLE 1
#define KEY_HOTKEY 2
#define KEY_XPOS 3
#define KEY_YPOS 4
#define KEY_COLS 5
#define KEY_FONT 6
#define KEY_PSCREEN 7
#define KEY_EDIT 8
#define KEY_ACTIVE 9
#define KEY_BDROP 10
#define KEY_CENTER 11
#define KEY_FRONT 12
#define KEY_MENU 13
#define KEY_PATT 14
#define KEY_POPUP 15
#define KEY_STICKY 16
#define KEY_TEXT 17
#define KEY_VERT 18
#define KEY_OK 19
#define KEY_CANCEL 20
static char KeyArray[KEY_CANCEL+1];
/* Init dock edit window */
void InitDockEditWindow(UWORD left, UWORD fheight)
{
ULONG llabwidth,lgadwidth,rlabwidth,rgadwidth;
ULONG cycwidth,cbwidth,butwidth,minstringwidth;
ULONG strheight=fheight+2;
ULONG i,tmp,yadd;
struct GadgetData *gd;
/* Init strings */
gdata[GAD_NAME_STR].name =AppStrings[MSG_WINDOW_NAME_GAD];
gdata[GAD_TITLE_STR].name =AppStrings[MSG_DOCKWIN_TITLE_GAD];
gdata[GAD_HOTKEY_STR].name =AppStrings[MSG_WINDOW_HOTKEY_GAD];
gdata[GAD_XPOS_INT].name =AppStrings[MSG_WINDOW_LEFTEDGE_GAD];
gdata[GAD_YPOS_INT].name =AppStrings[MSG_WINDOW_TOPEDGE_GAD];
gdata[GAD_COLUMNS_INT].name =AppStrings[MSG_DOCKWIN_COLUMNS_GAD];
cyclelabels[0] =AppStrings[MSG_WINDOW_POSITION_OPEN_LABEL];
cyclelabels[1] =AppStrings[MSG_WINDOW_POSITION_CLOSE_LABEL];
gdata[GAD_PSCREEN_TXT].name =AppStrings[MSG_WINDOW_PUBSCREEN_GAD];
gdata[GAD_FONT_BUT].name =AppStrings[MSG_DOCKWIN_FONT_GAD];
gdata[GAD_TOOLS].name =AppStrings[MSG_DOCKWIN_EDITTOOLS_GAD];
gdata[GAD_ACTIVATED].name =AppStrings[MSG_DOCKWIN_ACTIVATED_GAD];
gdata[GAD_BACKDROP].name =AppStrings[MSG_DOCKWIN_BACKDROP_GAD];
gdata[GAD_CENTERED].name =AppStrings[MSG_DOCKWIN_CENTERED_GAD];
gdata[GAD_FRONTMOST].name =AppStrings[MSG_DOCKWIN_FRONTMOST_GAD];
gdata[GAD_MENU].name =AppStrings[MSG_DOCKWIN_MENU_GAD];
gdata[GAD_PATTERN].name =AppStrings[MSG_DOCKWIN_PATTERN_GAD];
gdata[GAD_POPUP].name =AppStrings[MSG_DOCKWIN_POPUP_GAD];
gdata[GAD_STICKY].name =AppStrings[MSG_DOCKWIN_STICKY_GAD];
gdata[GAD_TEXT].name =AppStrings[MSG_DOCKWIN_TEXT_GAD];
gdata[GAD_VERTICAL].name =AppStrings[MSG_DOCKWIN_VERTICAL_GAD];
gdata[GAD_OK].name =AppStrings[MSG_WINDOW_OK_GAD];
gdata[GAD_CANCEL].name =AppStrings[MSG_WINDOW_CANCEL_GAD];
/* Calculate maximum label width (left side) */
llabwidth=0;
gd=&gdata[GAD_NAME_STR];
for (i=GAD_NAME_STR; i<=GAD_COLUMNS_INT; i++, gd++)
if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > llabwidth)
llabwidth=tmp;
llabwidth+=INTERWIDTH;
/* Calculate maximum gadget width (left side) */
minstringwidth=TextLength(&TmpRastPort,AppStrings[MSG_DOCKWIN_NEWNAME],
strlen(AppStrings[MSG_DOCKWIN_NEWNAME]))
+2*INTERWIDTH;
lgadwidth=minstringwidth;
/* Calculate maximum cyclegadget width */
{
char **s;
cycwidth=0;
s=cyclelabels;
for (i=0; i<=1; i++, s++)
if ((tmp=TextLength(&TmpRastPort,*s,strlen(*s))) > cycwidth)
cycwidth=tmp;
cycwidth+=5*INTERWIDTH;
}
if ((llabwidth+lgadwidth+INTERWIDTH) < cycwidth)
lgadwidth=cycwidth-llabwidth-INTERWIDTH;
/* Calculate maximum label width (right side) */
gd=&gdata[GAD_PSCREEN_TXT];
rlabwidth=TextLength(&TmpRastPort,gd->name,strlen(gd->name))+INTERWIDTH;
gd++;
if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))+2*INTERWIDTH)
> rlabwidth)
rlabwidth=tmp;
/* Calculate maximum gadget width (right side) */
rgadwidth=minstringwidth+REQBUTTONWIDTH;
/* Calculate maximum button gadget width */
gd=&gdata[GAD_TOOLS];
butwidth=TextLength(&TmpRastPort,gd->name,strlen(gd->name))+2*INTERWIDTH;
if ((rlabwidth+rgadwidth+INTERWIDTH) < butwidth)
rgadwidth=butwidth-rlabwidth-INTERWIDTH;
/* Calculate maximum checkbox gadget width */
cbwidth=0;
gd=&gdata[GAD_ACTIVATED];
for (i=GAD_ACTIVATED; i<=GAD_VERTICAL; i++, gd++)
if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > cbwidth)
cbwidth=tmp;
cbwidth+=CHECKBOX_WIDTH+INTERWIDTH;
if ((rlabwidth+rgadwidth) < 2*cbwidth)
rgadwidth=2*cbwidth-rlabwidth;
/* Calculate minimum window width */
ww=llabwidth+lgadwidth+rlabwidth+rgadwidth+4*INTERWIDTH;
/* Calculate button gadgets width */
gd=&gdata[GAD_OK];
butwidth=TextLength(&TmpRastPort,gd->name,strlen(gd->name));
gd++;
if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > butwidth)
butwidth=tmp;
butwidth+=2*INTERWIDTH;
if ((tmp=2*(butwidth+INTERWIDTH)) > ww) ww=tmp;
/* Calculate minimum window height */
wh=9*fheight+10*INTERHEIGHT+16;
/* Init gadgets */
gd=gdata;
tmp=(ww-llabwidth-lgadwidth-rlabwidth-rgadwidth-4*INTERWIDTH)/2;
lgadwidth+=tmp; /* String gadget length (left) */
rgadwidth+=tmp; /* String gadget length (right) */
llabwidth+=left+INTERWIDTH;
tmp=WindowTop+INTERHEIGHT;
yadd=strheight+INTERHEIGHT;
/* Name string gadget */
gd->type=STRING_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=nametags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=lgadwidth;
gd->height=strheight;
tmp+=yadd;
/* Title string gadget */
gd++;
gd->type=STRING_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=titletags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=lgadwidth;
gd->height=strheight;
tmp+=yadd;
/* HotKey string gadget */
gd++;
gd->type=STRING_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=hotktags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=lgadwidth;
gd->height=strheight;
tmp+=2*yadd;
/* LeftEdge integer gadget */
gd++;
gd->type=INTEGER_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=xpostags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=lgadwidth;
gd->height=strheight;
tmp+=yadd;
/* TopEdge integer gadget */
gd++;
gd->type=INTEGER_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=ypostags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=lgadwidth;
gd->height=strheight;
tmp+=yadd;
/* Columns integer gadget */
gd++;
gd->type=INTEGER_KIND;
gd->flags=PLACETEXT_LEFT;
gd->tags=colstags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=lgadwidth;
gd->height=strheight;
/* Position cycle gadget */
tmp=WindowTop+3*yadd+INTERHEIGHT;
gd++;
gd->type=CYCLE_KIND;
gd->flags=PLACETEXT_IN;
gd->tags=cycletags;
gd->left=left;
gd->top=tmp;
gd->width=lgadwidth+llabwidth-left;
gd->height=strheight;
/* PubScreen button gadget */
tmp=WindowTop+INTERHEIGHT;
llabwidth=ww-rgadwidth-INTERWIDTH+left;
gd++;
gd->type=GENERIC_KIND;
gd->flags=0;
gd->left=llabwidth;
gd->top=tmp;
gd->width=REQBUTTONWIDTH;
gd->height=strheight;
/* PubScreen txt gadget */
gd++;
gd->type=TEXT_KIND;
gd->flags=PLACETEXT_LEFT;
gd->left=llabwidth;
gd->top=tmp+strheight/2;
gd->width=0;
gd->height=0;
tmp+=yadd;
/* Font button gadget */
gd++;
gd->type=BUTTON_KIND;
gd->flags=PLACETEXT_IN;
gd->left=llabwidth-rlabwidth-INTERWIDTH;
gd->top=tmp;
gd->width=rlabwidth;
gd->height=strheight;
/* PubScreen string gadget */
tmp=WindowTop+INTERHEIGHT;
gd++;
gd->type=STRING_KIND;
gd->tags=pbsctags;
gd->left=llabwidth+REQBUTTONWIDTH;
gd->top=tmp;
gd->width=rgadwidth-REQBUTTONWIDTH;
gd->height=strheight;
tmp+=yadd;
/* Font text gadget */
gd++;
gd->type=TEXT_KIND;
gd->tags=fonttags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=rgadwidth;
gd->height=strheight;
tmp+=yadd;
/* Tools button gadget */
llabwidth-=rlabwidth+INTERWIDTH;
gd++;
gd->type=BUTTON_KIND;
gd->flags=PLACETEXT_IN;
gd->left=llabwidth;
gd->top=tmp;
gd->width=ww-llabwidth-INTERWIDTH+left;
gd->height=strheight;
tmp+=yadd+1;
if (OSV39) tmp+=INTERHEIGHT/2;
/* Activated checkbox gadget */
rlabwidth=(ww-llabwidth-INTERWIDTH+left-2*cbwidth)/3;
llabwidth+=rlabwidth;
cbwidth+=llabwidth+rlabwidth;
strheight=fheight-INTERHEIGHT;
gd++;
gd->type=CHECKBOX_KIND;
gd->flags=PLACETEXT_RIGHT;
gd->tags=actitags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=CHECKBOX_WIDTH;
gd->height=strheight;
/* Backdrop checkbox gadget */
gd++;
gd->type=CHECKBOX_KIND;
gd->flags=PLACETEXT_RIGHT;
gd->tags=backdtags;
gd->left=cbwidth;
gd->top=tmp;
gd->width=CHECKBOX_WIDTH;
gd->height=strheight;
tmp+=yadd;
/* Centered checkbox gadget */
gd++;
gd->type=CHECKBOX_KIND;
gd->flags=PLACETEXT_RIGHT;
gd->tags=centtags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=CHECKBOX_WIDTH;
gd->height=strheight;
/* Frontmost checkbox gadget */
gd++;
gd->type=CHECKBOX_KIND;
gd->flags=PLACETEXT_RIGHT;
gd->tags=fronttags;
gd->left=cbwidth;
gd->top=tmp;
gd->width=CHECKBOX_WIDTH;
gd->height=strheight;
tmp+=yadd;
/* Menu checkbox gadget */
gd++;
gd->type=CHECKBOX_KIND;
gd->flags=PLACETEXT_RIGHT;
gd->tags=menutags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=CHECKBOX_WIDTH;
gd->height=strheight;
/* Pattern checkbox gadget */
gd++;
gd->type=CHECKBOX_KIND;
gd->flags=PLACETEXT_RIGHT;
gd->tags=patttags;
gd->left=cbwidth;
gd->top=tmp;
gd->width=CHECKBOX_WIDTH;
gd->height=strheight;
tmp+=yadd;
/* PopUp checkbox gadget */
gd++;
gd->type=CHECKBOX_KIND;
gd->flags=PLACETEXT_RIGHT;
gd->tags=popuptags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=CHECKBOX_WIDTH;
gd->height=strheight;
/* Sticky checkbox gadget */
gd++;
gd->type=CHECKBOX_KIND;
gd->flags=PLACETEXT_RIGHT;
gd->tags=stickytags;
gd->left=cbwidth;
gd->top=tmp;
gd->width=CHECKBOX_WIDTH;
gd->height=strheight;
tmp+=yadd;
/* Text checkbox gadget */
gd++;
gd->type=CHECKBOX_KIND;
gd->flags=PLACETEXT_RIGHT;
gd->tags=texttags;
gd->left=llabwidth;
gd->top=tmp;
gd->width=CHECKBOX_WIDTH;
gd->height=strheight;
/* Vertical checkbox gadget */
gd++;
gd->type=CHECKBOX_KIND;
gd->flags=PLACETEXT_RIGHT;
gd->tags=verttags;
gd->left=cbwidth;
gd->top=tmp;
gd->width=CHECKBOX_WIDTH;
gd->height=strheight;
tmp+=yadd-1;
if (OSV39) tmp-=INTERHEIGHT/2;
/* OK button gadget */
gd++;
gd->type=BUTTON_KIND;
gd->flags=PLACETEXT_IN;
gd->left=left;
gd->top=tmp;
gd->width=butwidth;
gd->height=fheight;
/* Cancel button gadget */
gd++;
gd->type=BUTTON_KIND;
gd->flags=PLACETEXT_IN;
gd->left=ww-butwidth-INTERWIDTH+left;
gd->top=tmp;
gd->width=butwidth;
gd->height=fheight;
/* Init vanilla key array */
KeyArray[KEY_NAME] =FindVanillaKey(gdata[GAD_NAME_STR].name);
KeyArray[KEY_TITLE] =FindVanillaKey(gdata[GAD_TITLE_STR].name);
KeyArray[KEY_HOTKEY] =FindVanillaKey(gdata[GAD_HOTKEY_STR].name);
KeyArray[KEY_XPOS] =FindVanillaKey(gdata[GAD_XPOS_INT].name);
KeyArray[KEY_YPOS] =FindVanillaKey(gdata[GAD_YPOS_INT].name);
KeyArray[KEY_COLS] =FindVanillaKey(gdata[GAD_COLUMNS_INT].name);
KeyArray[KEY_FONT] =FindVanillaKey(gdata[GAD_FONT_BUT].name);
KeyArray[KEY_PSCREEN]=FindVanillaKey(gdata[GAD_PSCREEN_TXT].name);
KeyArray[KEY_EDIT] =FindVanillaKey(gdata[GAD_TOOLS].name);
KeyArray[KEY_ACTIVE] =FindVanillaKey(gdata[GAD_ACTIVATED].name);
KeyArray[KEY_BDROP] =FindVanillaKey(gdata[GAD_BACKDROP].name);
KeyArray[KEY_CENTER] =FindVanillaKey(gdata[GAD_CENTERED].name);
KeyArray[KEY_FRONT] =FindVanillaKey(gdata[GAD_FRONTMOST].name);
KeyArray[KEY_MENU] =FindVanillaKey(gdata[GAD_MENU].name);
KeyArray[KEY_PATT] =FindVanillaKey(gdata[GAD_PATTERN].name);
KeyArray[KEY_POPUP] =FindVanillaKey(gdata[GAD_POPUP].name);
KeyArray[KEY_TEXT] =FindVanillaKey(gdata[GAD_TEXT].name);
KeyArray[KEY_STICKY] =FindVanillaKey(gdata[GAD_STICKY].name);
KeyArray[KEY_VERT] =FindVanillaKey(gdata[GAD_VERTICAL].name);
KeyArray[KEY_OK] =FindVanillaKey(gdata[GAD_OK].name);
KeyArray[KEY_CANCEL] =FindVanillaKey(gdata[GAD_CANCEL].name);
/* Init dummy requester structure */
InitRequester(&DummyReq);
}
/* Free dock node */
void FreeDockNode(struct Node *node)
{
struct DockNode *dn=(struct DockNode *) node;
char *s;
if (s=dn->dn_Node.ln_Name) free(s);
if (s=dn->dn_HotKey) free(s);
if (s=dn->dn_PubScreen) free(s);
if (s=dn->dn_Title) free(s);
if (s=dn->dn_Font.ta_Name) free(s);
if (s=dn->dn_FontDesc) free(s);
/* Free tool list */
if (dn->dn_ToolsList) FreeToolsList(dn->dn_ToolsList);
/* Free node */
FreeMem(dn,sizeof(struct DockNode));
}
/* Build font descriptor string */
static char *BuildFontDesc(struct TextAttr *ta)
{
char *name;
if (name=strdup(ta->ta_Name)) {
ULONG len=strlen(name);
UWORD size=ta->ta_YSize%10000; /* Safety hack... */
UWORD div=1000;
char *s=&name[len-5];
BOOL InNumber=FALSE;
/* Overwrite ".font" */
*s++='/';
while (div) {
char c=size/div+'0';
if ((c!='0') || InNumber) {
*s++=c;
InNumber=TRUE;
}
size%=div;
div/=10;
}
*s++='\0';
}
return(name);
}
/* Copy dock node */
struct Node *CopyDockNode(struct Node *node)
{
struct DockNode *dn,*orignode=(struct DockNode *) node;
/* Alloc memory for dock node */
if (dn=AllocMem(sizeof(struct DockNode),MEMF_PUBLIC|MEMF_CLEAR)) {
/* Got an old node? */
if (orignode) {
/* Yes, copy it */
if ((!orignode->dn_Node.ln_Name || (dn->dn_Node.ln_Name=
strdup(orignode->dn_Node.ln_Name))) &&
(!orignode->dn_HotKey || (dn->dn_HotKey=strdup(orignode->dn_HotKey))) &&
(!orignode->dn_PubScreen || (dn->dn_PubScreen=
strdup(orignode->dn_PubScreen))) &&
(!orignode->dn_Title || (dn->dn_Title=strdup(orignode->dn_Title))) &&
(!orignode->dn_Font.ta_Name ||
((dn->dn_Font.ta_Name=strdup(orignode->dn_Font.ta_Name)) &&
(dn->dn_FontDesc=BuildFontDesc(&orignode->dn_Font)))) &&
(!orignode->dn_ToolsList || (dn->dn_ToolsList=
CopyToolsList(orignode->dn_ToolsList)))) {
/* Copy flags & numbers */
dn->dn_XPos=orignode->dn_XPos;
dn->dn_YPos=orignode->dn_YPos;
dn->dn_Columns=orignode->dn_Columns;
dn->dn_Font.ta_YSize=orignode->dn_Font.ta_YSize;
dn->dn_Font.ta_Style=orignode->dn_Font.ta_Style;
dn->dn_Font.ta_Flags=orignode->dn_Font.ta_Flags;
dn->dn_Flags=orignode->dn_Flags;
/* Return pointer to new node */
return(dn);
}
} else {
/* No, set defaults */
if (dn->dn_Node.ln_Name=strdup(AppStrings[MSG_DOCKWIN_NEWNAME])) {
dn->dn_Columns=1;
dn->dn_Flags=DOPOF_ACTIVATED;
/* Return pointer to new node */
return(dn);
}
}
FreeDockNode((struct Node *) dn);
}
/* Call failed */
return(NULL);
}
/* Activate gadget and save pointer to it */
static void MyActivateGadget(ULONG num)
{
ActivateGadget(gdata[num].gadget,w,NULL);
}
/* Open dock edit window */
BOOL OpenDockEditWindow(struct Node *node, struct Window *parent)
{
/* Copy node */
if (CurrentNode=(struct DockNode *) CopyDockNode(node)) {
/* Set tags */
nametags[0].ti_Data=(ULONG) CurrentNode->dn_Node.ln_Name;
titletags[0].ti_Data=(ULONG) CurrentNode->dn_Title;
hotktags[0].ti_Data=(ULONG) CurrentNode->dn_HotKey;
xpostags[0].ti_Data=CurrentNode->dn_XPos;
ypostags[0].ti_Data=CurrentNode->dn_YPos;
colstags[0].ti_Data=CurrentNode->dn_Columns;
pbsctags[0].ti_Data=(ULONG) CurrentNode->dn_PubScreen;
fonttags[0].ti_Data=(ULONG) CurrentNode->dn_FontDesc;
actitags[0].ti_Data=(CurrentNode->dn_Flags & DOPOF_ACTIVATED)!=0;
backdtags[0].ti_Data=(CurrentNode->dn_Flags & DOPOF_BACKDROP)!=0;
centtags[0].ti_Data=(CurrentNode->dn_Flags & DOPOF_CENTERED)!=0;
fronttags[0].ti_Data=(CurrentNode->dn_Flags & DOPOF_FRONTMOST)!=0;
menutags[0].ti_Data=(CurrentNode->dn_Flags & DOPOF_MENU)!=0;
patttags[0].ti_Data=(CurrentNode->dn_Flags & DOPOF_PATTERN)!=0;
popuptags[0].ti_Data=(CurrentNode->dn_Flags & DOPOF_POPUP)!=0;
stickytags[0].ti_Data=(CurrentNode->dn_Flags & DOPOF_STICKY)!=0;
texttags[0].ti_Data=(CurrentNode->dn_Flags & DOPOF_TEXT)!=0;
verttags[0].ti_Data=(CurrentNode->dn_Flags & DOPOF_VERTICAL)!=0;
/* Create gadgets */
if (gl=CreateGadgetList(gdata,GADGETS)) {
/* Open window */
if (w=OpenWindowTags(NULL,WA_Left, parent->LeftEdge,
WA_Top, parent->TopEdge+WindowTop,
WA_InnerWidth, ww,
WA_InnerHeight, wh,
WA_AutoAdjust, TRUE,
WA_Title, AppStrings[MSG_DOCKWIN_TITLE],
WA_PubScreen, PublicScreen,
WA_Flags, WFLG_CLOSEGADGET|WFLG_DRAGBAR|
WFLG_DEPTHGADGET|WFLG_RMBTRAP|
WFLG_ACTIVATE,
TAG_DONE)) {
/* Init requester button gadgets */
InitReqButtonGadget(gdata[GAD_PSCREEN_BUT].gadget);
/* Add gadgets to window */
AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
RefreshGList(gl,w,NULL,(UWORD) -1);
GT_RefreshWindow(w,NULL);
/* Activate name string gadget */
MyActivateGadget(GAD_NAME_STR);
/* Set local variables */
w->UserPort=IDCMPPort;
w->UserData=(BYTE *) HandleDockEditWindowIDCMP;
ModifyIDCMP(w,WINDOW_IDCMP);
CurrentWindow=w;
ReqOpen=FALSE;
/* All OK. */
return(TRUE);
}
FreeGadgets(gl);
}
FreeDockNode((struct Node *) CurrentNode);
}
/* Call failed */
return(FALSE);
}
/* Close dock edit window */
static void CloseDockEditWindow(void)
{
/* Free resources */
if (MoveWindowPtr) CloseMoveWindow();
RemoveGList(w,gl,(UWORD) -1);
CloseWindowSafely(w);
FreeGadgets(gl);
}
/* If move window open, move it to new position */
static void MoveMoveWindow(void)
{
/* Move window open? */
if (MoveWindowPtr) {
ULONG x,y;
/* Read current position */
x=((struct StringInfo *) gdata[GAD_XPOS_INT].gadget->SpecialInfo)->LongInt;
y=((struct StringInfo *) gdata[GAD_YPOS_INT].gadget->SpecialInfo)->LongInt;
/* Move move window */
MoveWindow(MoveWindowPtr,x-MoveWindowPtr->LeftEdge,y-MoveWindowPtr->TopEdge);
}
}
/* Public screen gadget function */
static void PubScreenGadgetFunc(void)
{
if (!ReqOpen) {
/* Save current gadget number */
CurrentGadgetNum=GAD_PSCREEN_BUT;
/* Open list requester */
if (OpenListRequester(LISTREQ_PUBSC,w)) {
/* Disable window */
DisableWindow(w,&DummyReq);
/* Set update function */
UpdateWindow=UpdateDockEditWindow;
ReqOpen=TRUE;
}
}
}
/* Font gadget function */
static void FontGadgetFunc(void)
{
struct TextAttr *newta;
/* Set old font */
newta=(CurrentNode->dn_FontDesc) ? &CurrentNode->dn_Font : NULL;
/* Open font requester */
if (newta=OpenFontRequester(w,&DummyReq,newta)) {
/* Font specified? */
if (newta->ta_Name) {
char *fontdesc;
/* Build font descriptor */
if (fontdesc=BuildFontDesc(newta)) {
/* All OK. Set new font */
GT_SetGadgetAttrs(gdata[GAD_FONT_TXT].gadget,w,NULL,GTTX_Text,fontdesc,
TAG_DONE);
/* Throw away old font */
if (CurrentNode->dn_FontDesc) {
free(CurrentNode->dn_Font.ta_Name);
free(CurrentNode->dn_FontDesc);
}
/* Set new font */
CurrentNode->dn_Font=*(newta);
CurrentNode->dn_FontDesc=fontdesc;
}
} else
/* User selected NO font, delete old one */
if (CurrentNode->dn_FontDesc) {
GT_SetGadgetAttrs(gdata[GAD_FONT_TXT].gadget,w,NULL,GTTX_Text,NULL,
TAG_DONE);
/* Free strings */
free(CurrentNode->dn_Font.ta_Name);
CurrentNode->dn_Font.ta_Name=NULL;
free(CurrentNode->dn_FontDesc);
CurrentNode->dn_FontDesc=NULL;
}
}
}
/* Edit gadget function */
static void EditGadgetFunc(void)
{
if (!ReqOpen) {
/* Save current gadget number */
CurrentGadgetNum=GAD_TOOLS;
/* Open edit window */
if (OpenDockListEditWindow(CurrentNode->dn_ToolsList,w)) {
/* Disable window */
DisableWindow(w,&DummyReq);
/* Set update function */
UpdateWindow=UpdateDockEditWindow;
ReqOpen=TRUE;
} else
DisplayBeep(NULL);
}
}
/* OK gadget function */
static struct Node *OKGadgetFunc(void)
{
struct Node *rc;
char *s;
/* Free old string */
if (s=CurrentNode->dn_Node.ln_Name) free(s);
CurrentNode->dn_Node.ln_Name=NULL;
if (s=CurrentNode->dn_HotKey) free(s);
CurrentNode->dn_HotKey=NULL;
if (s=CurrentNode->dn_PubScreen) free(s);
CurrentNode->dn_PubScreen=NULL;
if (s=CurrentNode->dn_Title) free(s);
CurrentNode->dn_Title=NULL;
/* Duplicate new string */
if (((CurrentNode->dn_Node.ln_Name=
DuplicateBuffer(gdata[GAD_NAME_STR].gadget)) != (char *) -1) &&
((CurrentNode->dn_HotKey=
DuplicateBuffer(gdata[GAD_HOTKEY_STR].gadget)) != (char *) -1) &&
((CurrentNode->dn_PubScreen=
DuplicateBuffer(gdata[GAD_PSCREEN_STR].gadget)) != (char *) -1) &&
((CurrentNode->dn_Title=
DuplicateBuffer(gdata[GAD_TITLE_STR].gadget)) != (char *) -1)) {
/* Copy integer gadget values */
CurrentNode->dn_XPos=
((struct StringInfo *) gdata[GAD_XPOS_INT].gadget->SpecialInfo)->LongInt;
CurrentNode->dn_YPos=
((struct StringInfo *) gdata[GAD_YPOS_INT].gadget->SpecialInfo)->LongInt;
CurrentNode->dn_Columns=
((struct StringInfo *) gdata[GAD_COLUMNS_INT].gadget->SpecialInfo)->LongInt;
rc=(struct Node *) CurrentNode;
} else {
/* Couldn't copy strings */
rc=(struct Node *) -1;
FreeDockNode((struct Node *) CurrentNode);
}
return(rc);
}
/* Handle dock edit window IDCMP events */
void *HandleDockEditWindowIDCMP(struct IntuiMessage *msg)
{
struct Node *NewNode=NULL;
/* Which IDCMP class? */
switch (msg->Class) {
case IDCMP_CLOSEWINDOW: NewNode=(struct Node *) -1;
FreeDockNode((struct Node *) CurrentNode);
break;
case IDCMP_REFRESHWINDOW: GT_BeginRefresh(w);
GT_EndRefresh(w,TRUE);
break;
case IDCMP_GADGETUP:
switch (((struct Gadget *) msg->IAddress)->GadgetID) {
case GAD_XPOS_INT: MoveMoveWindow();
break;
case GAD_YPOS_INT: MoveMoveWindow();
break;
case GAD_POSITION: /* Move window open? */
if (MoveWindowPtr)
/* Yes, close move window */
CloseMoveWindow();
else {
/* No. Open it! */
MoveWindowOffX=0;
MoveWindowOffY=0;
/* Open move window */
OpenMoveWindow(w,gdata[GAD_XPOS_INT].gadget,
gdata[GAD_YPOS_INT].gadget);
}
break;
case GAD_PSCREEN_BUT: PubScreenGadgetFunc();
break;
case GAD_FONT_BUT: FontGadgetFunc();
break;
case GAD_ACTIVATED: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_ACTIVATED;
break;
case GAD_BACKDROP: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_BACKDROP;
break;
case GAD_CENTERED: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_CENTERED;
break;
case GAD_FRONTMOST: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_FRONTMOST;
break;
case GAD_MENU: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_MENU;
break;
case GAD_PATTERN: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_PATTERN;
break;
case GAD_POPUP: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_POPUP;
break;
case GAD_STICKY: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_STICKY;
break;
case GAD_TEXT: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_TEXT;
break;
case GAD_VERTICAL: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_VERTICAL;
break;
case GAD_TOOLS: EditGadgetFunc();
break;
case GAD_OK: NewNode=OKGadgetFunc();
break;
case GAD_CANCEL: NewNode=(struct Node *) -1;
FreeDockNode((struct Node *) CurrentNode);
break;
}
break;
case IDCMP_VANILLAKEY:
switch (MatchVanillaKey(msg->Code,KeyArray)) {
case KEY_NAME: MyActivateGadget(GAD_NAME_STR);
break;
case KEY_TITLE: MyActivateGadget(GAD_TITLE_STR);
break;
case KEY_HOTKEY: MyActivateGadget(GAD_HOTKEY_STR);
break;
case KEY_XPOS: MyActivateGadget(GAD_XPOS_INT);
break;
case KEY_YPOS: MyActivateGadget(GAD_YPOS_INT);
break;
case KEY_COLS: MyActivateGadget(GAD_COLUMNS_INT);
break;
case KEY_PSCREEN: PubScreenGadgetFunc();
break;
case KEY_FONT: FontGadgetFunc();
break;
case KEY_EDIT: EditGadgetFunc();
break;
case KEY_ACTIVE: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_ACTIVATED;
/* Set check box gadget */
GT_SetGadgetAttrs(gdata[GAD_ACTIVATED].gadget,w,NULL,
GTCB_Checked, (CurrentNode->dn_Flags & DOPOF_ACTIVATED),
TAG_DONE);
break;
case KEY_BDROP: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_BACKDROP;
/* Set check box gadget */
GT_SetGadgetAttrs(gdata[GAD_BACKDROP].gadget,w,NULL,
GTCB_Checked, (CurrentNode->dn_Flags & DOPOF_BACKDROP),
TAG_DONE);
break;
case KEY_CENTER: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_CENTERED;
/* Set check box gadget */
GT_SetGadgetAttrs(gdata[GAD_CENTERED].gadget,w,NULL,
GTCB_Checked, (CurrentNode->dn_Flags & DOPOF_CENTERED),
TAG_DONE);
break;
case KEY_FRONT: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_FRONTMOST;
/* Set check box gadget */
GT_SetGadgetAttrs(gdata[GAD_FRONTMOST].gadget,w,NULL,
GTCB_Checked, (CurrentNode->dn_Flags & DOPOF_FRONTMOST),
TAG_DONE);
break;
case KEY_MENU: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_MENU;
/* Set check box gadget */
GT_SetGadgetAttrs(gdata[GAD_MENU].gadget,w,NULL,
GTCB_Checked, (CurrentNode->dn_Flags & DOPOF_MENU),
TAG_DONE);
break;
case KEY_PATT: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_PATTERN;
/* Set check box gadget */
GT_SetGadgetAttrs(gdata[GAD_PATTERN].gadget,w,NULL,
GTCB_Checked, (CurrentNode->dn_Flags & DOPOF_PATTERN),
TAG_DONE);
break;
case KEY_POPUP: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_POPUP;
/* Set check box gadget */
GT_SetGadgetAttrs(gdata[GAD_POPUP].gadget,w,NULL,
GTCB_Checked, (CurrentNode->dn_Flags & DOPOF_POPUP),
TAG_DONE);
break;
case KEY_STICKY: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_STICKY;
/* Set check box gadget */
GT_SetGadgetAttrs(gdata[GAD_STICKY].gadget,w,NULL,
GTCB_Checked, (CurrentNode->dn_Flags & DOPOF_STICKY),
TAG_DONE);
break;
case KEY_TEXT: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_TEXT;
/* Set check box gadget */
GT_SetGadgetAttrs(gdata[GAD_TEXT].gadget,w,NULL,
GTCB_Checked, (CurrentNode->dn_Flags & DOPOF_TEXT),
TAG_DONE);
break;
case KEY_VERT: /* Toggle flag */
CurrentNode->dn_Flags^=DOPOF_VERTICAL;
/* Set check box gadget */
GT_SetGadgetAttrs(gdata[GAD_VERTICAL].gadget,w,NULL,
GTCB_Checked, (CurrentNode->dn_Flags & DOPOF_VERTICAL),
TAG_DONE);
break;
case KEY_OK: NewNode=OKGadgetFunc();
break;
case KEY_CANCEL: NewNode=(struct Node *) -1;
FreeDockNode((struct Node *) CurrentNode);
break;
}
break;
}
/* Close window? */
if (NewNode) {
/* Yes. But first reply message!!! */
GT_ReplyIMsg(msg);
CloseDockEditWindow();
}
return(NewNode);
}
/* Update dock edit window */
void UpdateDockEditWindow(void *data)
{
/* Which data? */
switch (CurrentGadgetNum) {
case GAD_PSCREEN_BUT: /* Got data? */
if (data != LREQRET_CANCEL) {
char *new;
/* Selected something? */
new=(data == LREQRET_NOSELECT) ?
NULL : ((struct Node *) data)->ln_Name;
/* set new public screen name */
GT_SetGadgetAttrs(gdata[GAD_PSCREEN_STR].gadget,w,
NULL,GTST_String,new,TAG_DONE);
}
break;
case GAD_TOOLS: /* Got data? */
if (data != (void *) -1) {
/* Free old tools list */
if (CurrentNode->dn_ToolsList)
FreeToolsList(CurrentNode->dn_ToolsList);
/* Set new tools list */
CurrentNode->dn_ToolsList=data;
}
break;
}
/* Enable window */
EnableWindow(w,&DummyReq,WINDOW_IDCMP);
/* Restore update function pointer */
UpdateWindow=UpdateMainWindow;
CurrentWindow=w;
ReqOpen=FALSE;
}
/* Read TMDO IFF chunk into Dock node */
struct Node *ReadDockNode(UBYTE *buf)
{
struct DockNode *dn;
/* Allocate memory for node */
if (dn=AllocMem(sizeof(struct DockNode),MEMF_PUBLIC|MEMF_CLEAR)) {
struct DockPrefsObject *dpo=(struct DockPrefsObject *) buf;
ULONG sbits=dpo->dpo_StringBits;
UBYTE *ptr=(UBYTE *) &dpo[1];
struct List *toolslist;
if ((!(sbits & DOPO_NAME) || (dn->dn_Node.ln_Name=GetConfigStr(&ptr))) &&
(!(sbits & DOPO_HOTKEY) || (dn->dn_HotKey=GetConfigStr(&ptr))) &&
(!(sbits & DOPO_PSCREEN) || (dn->dn_PubScreen=GetConfigStr(&ptr))) &&
(!(sbits & DOPO_TITLE) || (dn->dn_Title=GetConfigStr(&ptr))) &&
(!(sbits & DOPO_FONTNAME) || (dn->dn_Font.ta_Name=GetConfigStr(&ptr))) &&
(toolslist=malloc(sizeof(struct List)))) {
LONG tools=0;
UBYTE tlflags;
/* Init list */
NewList(toolslist);
dn->dn_ToolsList=toolslist;
/* Get tools */
while ((tlflags=*ptr++) & DOPOT_CONTINUE) {
struct ToolNode *tn;
if (tn=AllocMem(sizeof(struct ToolNode),MEMF_PUBLIC|MEMF_CLEAR)) {
/* Add tool to list */
AddTail(toolslist,(struct Node *) tn);
if ((!(tlflags & DOPOT_EXEC) || (tn->tn_Node.ln_Name=
GetConfigStr(&ptr))) &&
(!(tlflags & DOPOT_IMAGE) || (tn->tn_Image=GetConfigStr(&ptr))) &&
(!(tlflags & DOPOT_SOUND) || (tn->tn_Sound=GetConfigStr(&ptr))))
/* All OK. */
tools++;
else {
/* Error */
tools=-1;
break;
}
} else {
/* No memory. */
tools=-1;
break;
}
}
/* Error? */
if (tools!=-1) {
/* Got tools? */
if (tools==0) {
/* No, free list structure */
free(toolslist);
dn->dn_ToolsList=NULL;
}
/* Copy flags & values */
dn->dn_Flags=dpo->dpo_Flags;
dn->dn_XPos=dpo->dpo_XPos;
dn->dn_YPos=dpo->dpo_YPos;
dn->dn_Columns=dpo->dpo_Columns;
dn->dn_Font.ta_YSize=dpo->dpo_Font.ta_YSize;
dn->dn_Font.ta_Style=dpo->dpo_Font.ta_Style;
dn->dn_Font.ta_Flags=dpo->dpo_Font.ta_Flags;
/* All OK. */
return(dn);
}
}
/* Call failed */
FreeDockNode((struct Node *) dn);
}
return(NULL);
}
/* Write Dock node to TMDO IFF chunk */
BOOL WriteDockNode(struct IFFHandle *iff, UBYTE *buf, struct Node *node)
{
struct DockNode *dn=(struct DockNode *) node;
struct DockPrefsObject *dpo=(struct DockPrefsObject *) buf;
ULONG sbits=0;
UBYTE *ptr=(UBYTE *) &dpo[1];
/* Copy strings */
if (PutConfigStr(dn->dn_Node.ln_Name,&ptr)) sbits|=DOPO_NAME;
if (PutConfigStr(dn->dn_HotKey,&ptr)) sbits|=DOPO_HOTKEY;
if (PutConfigStr(dn->dn_PubScreen,&ptr)) sbits|=DOPO_PSCREEN;
if (PutConfigStr(dn->dn_Title,&ptr)) sbits|=DOPO_TITLE;
if (PutConfigStr(dn->dn_Font.ta_Name,&ptr)) sbits|=DOPO_FONTNAME;
/* set string bits */
dpo->dpo_StringBits=sbits;
/* Write tool list */
if (dn->dn_ToolsList) {
struct ToolNode *tn=GetHead(dn->dn_ToolsList);
while (tn) {
UBYTE *flptr=ptr++;
UBYTE tfl=DOPOT_CONTINUE;
if (PutConfigStr(tn->tn_Node.ln_Name,&ptr)) tfl|=DOPOT_EXEC;
if (PutConfigStr(tn->tn_Image,&ptr)) tfl|=DOPOT_IMAGE;
if (PutConfigStr(tn->tn_Sound,&ptr)) tfl|=DOPOT_SOUND;
/* Put flags */
*flptr=tfl;
/* Get next node */
tn=GetSucc(tn);
}
}
/* Append terminator */
*ptr++=0;
/* Copy flags & values */
dpo->dpo_Flags=dn->dn_Flags;
dpo->dpo_XPos=dn->dn_XPos;
dpo->dpo_YPos=dn->dn_YPos;
dpo->dpo_Columns=dn->dn_Columns;
dpo->dpo_Font.ta_YSize=dn->dn_Font.ta_YSize;
dpo->dpo_Font.ta_Style=dn->dn_Font.ta_Style;
dpo->dpo_Font.ta_Flags=dn->dn_Font.ta_Flags;
/* calculate length */
sbits=ptr-buf;
DEBUG_PRINTF("chunk size %ld\n",sbits);
/* Open chunk */
if (PushChunk(iff,0,ID_TMDO,sbits)) return(FALSE);
/* Write chunk */
if (WriteChunkBytes(iff,buf,sbits)!=sbits) return(FALSE);
/* Close chunk */
if (PopChunk(iff)) return(FALSE);
/* All OK. */
return(TRUE);
}